package com.example.springboottest.example.nio.netty.embed;

import com.example.springboottest.example.nio.netty.NettyDiscardHandler;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.embedded.EmbeddedChannel;

import java.nio.charset.StandardCharsets;

/**
 * EmbeddedChannel 仅仅是模拟入站与出站的操作，底层不进行实际的传输，不需要启动 Netty
 * 服务器和客户端。除了不进行传输之外，EmbeddedChannel 的其他的事件机制和处理流程和真正的
 * 传输通道是一模一样的。因此，使用它，开发人员可以在开发的过程中方便、快速地进行
 * ChannelHandler 业务处理器的单元测试。
 * <p>
 * 专用于测试业务
 */
public class EmbeddedChannelTest {
    public static void main(String[] args) {
        final NettyDiscardHandler inHandler = new NettyDiscardHandler();
        //初始化处理器
        ChannelInitializer i = new ChannelInitializer<EmbeddedChannel>() {
            protected void initChannel(EmbeddedChannel ch) {
                ch.pipeline().addLast(inHandler);
            }
        };
        //创建嵌入式通道
        EmbeddedChannel channel = new EmbeddedChannel(i);
        ByteBuf buf = Unpooled.buffer();
        buf.writeBytes("Hello ".getBytes(StandardCharsets.UTF_8));
        //模拟入站，写一个入站数据包
        channel.writeInbound(buf);
        channel.flush();
        buf = Unpooled.buffer();
        //模拟入站，再写一个入站数据包
        buf.writeBytes("World".getBytes(StandardCharsets.UTF_8));
        channel.writeInbound(buf);
        channel.flush();
        //通道关闭
        channel.close();
        try {
            Thread.sleep(Integer.MAX_VALUE);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
